// 本文件是对 axios 经行二次封装

// 导入 axios
import axios from 'axios';
import router from '@/router';
import { useUserStore } from '@/stores/user';
import { ElMessage } from 'element-plus';


// 创建实例
const instance = axios.create({
  // 基本路径
  baseURL: 'http://localhost:4000/api',
  // 最大请求时间
  timeout: 5000
})

// 请求拦截器
instance.interceptors.request.use(function (config) {
  // 在发送请求之前做些什么
  // 在请求之前封装 token(如果有)
  const useStore = useUserStore()
  const { token } = useStore
  if (token) {
    config.headers.Authorization = `Bearer ${token}`
  }
  return config;
}, function (error) {
  // 对请求错误做些什么
  return Promise.reject(error);
});

// 相应状态码
const RESPONSE_CODE = {
  success: 10000, // 成功
  unauthorized: 401 // token 过期
}

// 响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 目的： 如果成功 那么返回一个节俭的数据 否则就返回一个 Promise.reject 对象
    // 将 data 解构出来 变为 resp
    const { data: resp } = response
    // 再次解构
    const { data, code, message } = resp

    // 成功 返回一个最简的数据
    if (code === RESPONSE_CODE.success) return data
    // 失败
    return Promise.reject(new Error(message));
  },
  function (error) {
    // 解构出 status 和 message
    const {
      status,
      data: { message }
    } = error.response

    // 超出 2xx 范围的状态码都会触发该函数。
    if (status === RESPONSE_CODE.unauthorized) {
      // 提示内容信息
      ElMessage.error(message)
      const userStore = useUserStore()
      // 清除用户信息 + token
      userStore.logout()
      // 跳转到登录页面 router.currentRoute.value.path 获取当前的路径
      router.push(`/login?redirectUrl=${router.currentRoute.value.path}`)
    }

    return Promise.reject(error);
  }
);

// 导出
export default instance